/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import commande.Command;
import entity.Client;
import entity.Commande;
import entity.Description;
import entity.EtatCommande;
import entity.Langue;
import entity.Produit;
import entity.TypeProduit;
import entity.Utilisateur;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import managers.CommandManager;
import managers.ProduitEtDescrip;
import managers.ProduitManager;
import managers.UserManager;
import session.ClientFacade;
import session.CommandeFacade;
import session.EtatCommandeFacade;
import session.LangueFacade;
import session.ProduitFacade;
import session.TypeProduitFacade;
import session.UtilisateurFacade;

/**
 *
 * @author livetnediser
 */
@WebServlet(name = "AdminServlet", urlPatterns = {
    "/admin",
    "/userslist",
    "/modifyitem",
    "/selmodifyItem",
    "/selcreateItem",
    "/douser",
    "/userDetail",
    "/userDelete",
    "/changeProd",
    "/createitem",
    "/createProd",
    "/commandesClient",
    "/commandDetail",
    "/modifierEtat",
    "/modifierEtatGen",
    "/commandesList",
    "/doadmin"})
public class AdminServlet extends HttpServlet {

    @EJB
    private UtilisateurFacade utilisateurFacade;
    @EJB
    private UserManager userManager;
    @EJB
    private ClientFacade clientFacade;
    @EJB
    private ProduitManager produitManager;
    @EJB
    private TypeProduitFacade typeProduitFacade;
    @EJB
    private ProduitFacade produitFacade;
    @EJB
    private EtatCommandeFacade etatCommandeFacade;
    @EJB
    private CommandeFacade commandeFacade;
    @EJB
    private CommandManager commandManager;
    @EJB
    private LangueFacade langueFacade;
    private Langue defaultLangue = new Langue(3);
    
    
    @Override
    public void init() throws ServletException {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userPath = request.getServletPath();
        HttpSession session = request.getSession();
        boolean urlToDo = true;
        
        if(request.getLocale().getLanguage().equals("es")){
            this.defaultLangue = new Langue(3);
        } else if(request.getLocale().getLanguage().equals("en")){
            this.defaultLangue = new Langue(2);
        } else {
            this.defaultLangue = new Langue(1); 
        } 
        String url = "";
        if (session.getAttribute("clientloged") != null && utilisateurFacade.findByUser((String) session.getAttribute("clientloged")).getIdClient().getIdType() == 1) {
            if (userPath.equals("/admin")) {
                userPath = "/main";
            } else if (userPath.equals("/userslist")) {
                userPath = "/userlist";
                session.setAttribute("userslist", utilisateurFacade.findAll());
            } else if (userPath.equals("/douser")) {
                userPath = "/userlist";
                userManager.changeType(request.getQueryString(), 2);
                session.setAttribute("userslist", utilisateurFacade.findAll());
            } else if (userPath.equals("/doadmin")) {
                userPath = "/userlist";
                userManager.changeType(request.getQueryString(), 1);
                session.setAttribute("userslist", utilisateurFacade.findAll());
            } else if (userPath.equals("/userDetail")) {
                userPath = "/userDetail";
                String user = request.getQueryString();
                Utilisateur ut = utilisateurFacade.findById(user);
                Client c = ut.getIdClient();
                GregorianCalendar cal = new GregorianCalendar();
                cal.setTime(c.getDateNaissance());
                session.setAttribute("dayc", cal.get(Calendar.DAY_OF_MONTH));
                if (cal.get(Calendar.MONTH) == 0) {
                    session.setAttribute("monthc", 12);
                } else {
                    session.setAttribute("monthc", cal.get(Calendar.MONTH));
                }
                session.setAttribute("yearc", cal.get(Calendar.YEAR));
                request.setAttribute("user", ut);
                request.setAttribute("client",c);
                
            } else if(userPath.equals("/userDelete")){
                userPath = "/userlist";
                String user = request.getQueryString();
                Utilisateur ut = utilisateurFacade.findById(user);
                Client client = ut.getIdClient();
                utilisateurFacade.remove(ut);
                clientFacade.remove(client);
                session.setAttribute("userslist", utilisateurFacade.findAll());
                
            } else if (userPath.equals("/createitem")) {
                userPath = "/createItem";
                session.setAttribute("selectedType", ""+0);
                session.setAttribute("selectedSubType", ""+0);
                session.setAttribute("realselectedSubType", ""+produitManager.getSubTypes(defaultLangue).get(0).get(0).getIdtypeProduit());
                session.setAttribute("realselectedType", produitManager.getTypes(defaultLangue).get(0).getIdtypeProduit());
                session.setAttribute("types", produitManager.getTypes(defaultLangue));
                session.setAttribute("subtypes", produitManager.getSubTypes(defaultLangue)); 
                
            } else if (userPath.equals("/modifyitem")) {
                userPath = "/modifyItem";
                session.setAttribute("langues", langueFacade.findAll());
                session.setAttribute("selectedLang", ""+defaultLangue.getIdlangue());
                session.setAttribute("selectedType", ""+0);
                session.setAttribute("selectedSubType", ""+0);
                session.setAttribute("selectedTypeN", ""+0);
                session.setAttribute("selectedSubTypeN", ""+0);
                session.setAttribute("realselectedTypeN", produitManager.getTypes(defaultLangue).get(0).getIdtypeProduit());
                session.setAttribute("realselectedSubType", ""+produitManager.getSubTypes(defaultLangue).get(0).get(0).getIdtypeProduit());
                session.setAttribute("selectedProd", produitManager.getProdEtDescrip(defaultLangue, produitManager.getSubTypes(defaultLangue).get(0).get(0), false).get(0).getProduit().getIdproduit());
                session.setAttribute("realselectedType", produitManager.getTypes(defaultLangue).get(0).getIdtypeProduit());
                session.setAttribute("types", produitManager.getTypes(defaultLangue));
                session.setAttribute("subtypes", produitManager.getSubTypes(defaultLangue)); 
                session.setAttribute("produits", produitManager.getProdEtDescrip(defaultLangue, produitManager.getSubTypes(defaultLangue).get(0).get(0), false));

            } else if (userPath.equals("/selmodifyItem")) {
                userPath = "/modifyItem";
                if(request.getParameter("reftype") != null){
                    session.setAttribute("selectedType", produitManager.retOrdType(Integer.parseInt(request.getParameter("reftype"))));
                    session.setAttribute("realselectedType", request.getParameter("reftype"));
                    
                    session.setAttribute("selectedTypeN", produitManager.retOrdType(Integer.parseInt(request.getParameter("reftype"))));
                    session.setAttribute("realselectedTypeN", request.getParameter("reftype"));

                }
                if(request.getParameter("refsubtype") != null){
                    session.setAttribute("selectedSubType", produitManager.retOrdSpecType((Integer) session.getAttribute("realselectedType"), Integer.parseInt(request.getParameter("refsubtype"))));
                    session.setAttribute("realselectedSubType", request.getParameter("refsubtype"));
                    
                    session.setAttribute("selectedSubTypeN", produitManager.retOrdSpecType((Integer) session.getAttribute("realselectedType"), Integer.parseInt(request.getParameter("refsubtype"))));
                    session.setAttribute("realselectedSubTypeN", request.getParameter("refsubtype"));
                    
                    session.setAttribute("produits", produitManager.getProdEtDescrip(langueFacade.find(Integer.parseInt((String)session.getAttribute("selectedLang"))), typeProduitFacade.findTypeProduitById(request.getParameter("refsubtype"), defaultLangue), false));
                    try{
                    session.setAttribute("selectedProd", produitManager.getProdEtDescrip(langueFacade.find(Integer.parseInt((String)session.getAttribute("selectedLang"))), typeProduitFacade.findTypeProduitById(request.getParameter("refsubtype"), defaultLangue), false).get(0).getProduit().getIdproduit());
                    }catch(Exception e){
                        
                    }
                }
                //CAMBIAR!!!!!! findTypeProduitById
                if(request.getParameter("refprod") != null){
                    session.setAttribute("selectedProd", Integer.parseInt(request.getParameter("refprod")));
                    List<ProduitEtDescrip> prods = (List<ProduitEtDescrip>) session.getAttribute("produits");
                    for(int i =0; i< prods.size(); i++){
                        if(prods.get(i).getProduit().getIdproduit() ==  Integer.parseInt(request.getParameter("refprod"))){
                            session.setAttribute("selectedProdOrd", i); 
                        }
                    }
                }
                if(request.getParameter("reftypeN") != null){
                    session.setAttribute("selectedTypeN", produitManager.retOrdType(Integer.parseInt(request.getParameter("reftypeN"))));
                    session.setAttribute("realselectedTypeN", request.getParameter("reftypeN"));

                }
                if(request.getParameter("refsubtypeN") != null){
                    session.setAttribute("selectedSubTypeN", request.getParameter("refsubtypeN"));
                }
                if(request.getParameter("lang") != null){
                    session.setAttribute("selectedLang", request.getParameter("lang"));
                    session.setAttribute("produits", produitManager.getProdEtDescrip(langueFacade.find(Integer.parseInt(request.getParameter("lang"))), typeProduitFacade.findTypeProduitById((String) session.getAttribute("realselectedSubType"),defaultLangue), false));
                    session.setAttribute("selectedProd", produitManager.getProdEtDescrip(langueFacade.find(Integer.parseInt(request.getParameter("lang"))), typeProduitFacade.findTypeProduitById((String) session.getAttribute("realselectedSubType"), defaultLangue), false).get(0).getProduit().getIdproduit());


                }
            } else if (userPath.equals("/selcreateItem")) {
                userPath = "/createItem";
                if(request.getParameter("reftype") != null){
                    session.setAttribute("selectedType", produitManager.retOrdType(Integer.parseInt(request.getParameter("reftype"))));
                    session.setAttribute("realselectedType", request.getParameter("reftype"));
                    
                }
                if(request.getParameter("refsubtype") != null){
                    session.setAttribute("selectedSubType", produitManager.retOrdSpecType(Integer.parseInt((String) session.getAttribute("realselectedType")), Integer.parseInt(request.getParameter("refsubtype"))));
                    session.setAttribute("realselectedSubType", request.getParameter("refsubtype"));
                    
                }
            } else if (userPath.equals("/commandesClient")){
                userPath = "/commandesClient";
                String user = request.getQueryString();
                Utilisateur ut = utilisateurFacade.findById(user);
                List<EtatCommande> etats = etatCommandeFacade.getEtatsByLangue(defaultLangue);
                session.setAttribute("commandes", commandeFacade.findByClient(ut.getIdClient()));
                session.setAttribute("etats", etats); 
                session.setAttribute("utilisateur",ut);
                
            } else if (userPath.equals("/commandDetail")){
                userPath = "/commandDetail";
                Command c = commandManager.loadCommand(Integer.parseInt(request.getQueryString()), langueFacade.find(1));
                Commande com = commandeFacade.find(Integer.parseInt(request.getQueryString()));
                Client client = com.getIdclient();
                getServletContext().setAttribute("commande", c);
                getServletContext().setAttribute("client", client);
            
            }  else if(userPath.equals("/commandesList")){
                userPath = "/commandesList";
                List<Commande> commandes = commandeFacade.findAll();
                List<Utilisateur> utilisateurs = utilisateurFacade.findAll();
                List<EtatCommande> etats = etatCommandeFacade.findAll(); 
                getServletContext().setAttribute("commandes", commandes);                   
                getServletContext().setAttribute("utilisateurs", utilisateurs);                     
                getServletContext().setAttribute("etats", etats);  
            }   
        } else {
            urlToDo = false;
            url = "/index.jsp";
        }
        if (urlToDo) {
            url = "/WEB-INF/admin/view" + userPath + ".jsp";
        }

        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (Exception ex) {
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String userPath = request.getServletPath();
        HttpSession session = request.getSession();
        boolean urlToDo = true;
        String url = "";
        
        if(request.getLocale().getLanguage().equals("es")){
            this.defaultLangue = new Langue(3);
        } else if(request.getLocale().getLanguage().equals("en")){
            this.defaultLangue = new Langue(2);
        } else {
            this.defaultLangue = new Langue(1); 
        } 
        
        if (session.getAttribute("clientloged") != null && utilisateurFacade.findByUser((String) session.getAttribute("clientloged")).getIdClient().getIdType() == 1) {

            if (userPath.equals("/admin")) {
                
            } else if (userPath.equals("/changeProd")) {
                userPath = "/modifyItem";
                produitManager.updateProduct(request.getParameter("tproducte"), request.getParameter("preu"), request.getParameter("remise"), request.getParameter("st_ini"), 
                        request.getParameter("st_act"), request.getParameter("st_notif"), request.getParameter("tipDesSort_sp"), request.getParameter("tipDesLong"),
                        request.getParameter("tags"), request.getParameter("Tipus_producteN"), request.getParameter("Subtipus_producteN"), request.getParameter("pic"), langueFacade.find(Integer.parseInt(request.getParameter("langue"))));
                session.setAttribute("produits", produitManager.getProdEtDescrip(langueFacade.find(Integer.parseInt(request.getParameter("langue"))), typeProduitFacade.findTypeProduitById((String) session.getAttribute("realselectedSubType"), defaultLangue), false));

                
                List<Produit> listprodremise = produitFacade.findProduitWithRemise();
                List<ProduitEtDescrip> decsremise = new ArrayList<ProduitEtDescrip>();
                for (Produit p : listprodremise) {
                    Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
                    ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
                    decsremise.add(prodEtDesc);
                }
                session.setAttribute("decsremise", decsremise);
                //request.getParameter("Tipus_producte");
                //request.getParameter("Subtipus_producte");
               
                
            } else if (userPath.equals("/createProd")) {
                urlToDo = false;
                url = "/WEB-INF/view/product.jsp";
                ProduitEtDescrip prodEtDescN = produitManager.createProduct(request.getParameter("preu"), request.getParameter("remise"), request.getParameter("st_ini"), 
                        request.getParameter("st_act"), request.getParameter("st_notif"), request.getParameter("tipDesSort_sp"), request.getParameter("tipDesLong"),
                        request.getParameter("tags"), request.getParameter("Tipus_producte"), request.getParameter("Subtipus_producte"), request.getParameter("pic"), langueFacade.findAll());
               
                List<Produit> listprodremise = produitFacade.findProduitWithRemise();
                List<ProduitEtDescrip> decsremise = new ArrayList<ProduitEtDescrip>();
                for (Produit p : listprodremise) {
                    Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
                    ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
                    decsremise.add(prodEtDesc);
                }
                session.setAttribute("decsremise", decsremise);
                TypeProduit categorie = typeProduitFacade.findTypeProduitById(String.valueOf(prodEtDescN.getProduit().getIdTypeProdGenerique()), defaultLangue);
                TypeProduit subtype = typeProduitFacade.findTypeProduitById(""+prodEtDescN.getProduit().getIdTypeProdSpecifique(), defaultLangue);
                request.setAttribute("prodEtDesc", prodEtDescN);
                request.setAttribute("categorie", categorie);
                request.setAttribute("subcategorie",subtype);
                
            }else if (userPath.equals("/modifierEtat")){                
                userPath = "/commandesClient";
                Commande com = commandeFacade.find(Integer.parseInt(request.getParameter("idcommande")));
                commandManager.changeState(com, etatCommandeFacade.find(Integer.parseInt(request.getParameter("etat"))));
                Utilisateur ut = utilisateurFacade.findByClient(com.getIdclient());
                List<EtatCommande> etats = etatCommandeFacade.getEtatsByLangue(defaultLangue);
                session.setAttribute("commandes", commandeFacade.findByClient(ut.getIdClient()));
                session.setAttribute("etats", etats); 
            
            }else if (userPath.equals("/modifierEtatGen")){                
                userPath = "/commandesList";
                Commande com = commandeFacade.find(Integer.parseInt(request.getParameter("idcommande")));
                commandManager.changeState(com, etatCommandeFacade.find(Integer.parseInt(request.getParameter("etat"))));
                List<Commande> commandes = commandeFacade.findAll();
                List<Utilisateur> utilisateurs = utilisateurFacade.findAll();
                List<EtatCommande> etats = etatCommandeFacade.findAll(); 
                getServletContext().setAttribute("commandes", commandes);                   
                getServletContext().setAttribute("utilisateurs", utilisateurs);                     
                getServletContext().setAttribute("etats", etats);   
            
            }         

        } else {
            urlToDo = false;
            url = "/index.jsp";
        }
        if (urlToDo) {
            url = "/WEB-INF/admin/view" + userPath + ".jsp";
        }

        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (Exception ex) {
        }
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
